home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 7
/
Amiga Format AFCD07 (Dec 1996, Issue 91).iso
/
serious
/
shareware
/
programming
/
aros
/
dos
/
parsepatternnocase.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-12
|
5KB
|
187 lines
/*
(C) 1995-96 AROS - The Amiga Replacement OS
$Id: parsepatternnocase.c,v 1.1 1996/09/11 12:54:46 digulla Exp $
$Log: parsepatternnocase.c,v $
Revision 1.1 1996/09/11 12:54:46 digulla
A couple of new DOS functions from M. Fleischer
Desc:
Lang: english
*/
#include <clib/exec_protos.h>
#include <clib/utility_protos.h>
#include <dos/dos.h>
#include <dos/dosasl.h>
#include "dos_intern.h"
/*****************************************************************************
NAME */
#include <clib/dos_protos.h>
__AROS_LH3(LONG, ParsePatternNoCase,
/* SYNOPSIS */
__AROS_LHA(STRPTR, Source, D1),
__AROS_LHA(STRPTR, Dest, D2),
__AROS_LHA(LONG, DestLength, D3),
/* LOCATION */
struct DosLibrary *, DOSBase, 161, Dos)
/* FUNCTION
Similar to ParsePattern(), only case insensitive (see there
for more information). For use with MatchPatternNoCase().
INPUTS
RESULT
NOTES
EXAMPLE
BUGS
SEE ALSO
ParsePattern(), MatchPatternNoCase().
INTERNALS
HISTORY
29-10-95 digulla automatically created from
dos_lib.fd and clib/dos_protos.h
*****************************************************************************/
{
__AROS_FUNC_INIT
__AROS_BASE_EXT_DECL(struct DosLibrary *,DOSBase)
STRPTR stack, end;
UBYTE a, b, t;
LONG iswild=0;
LONG *result=&((struct Process *)FindTask(NULL))->pr_Result2;
#define ERROR(a) { *result=a; return -1; }
stack=end=Dest+DestLength;
#define PUT(a) { if(Dest>=stack) ERROR(ERROR_BUFFER_OVERFLOW); *Dest++=(a); }
if(!*Source)
{
PUT(0);
return 0;
}else
PUT(MP_OR);
while(*Source)
{
switch(*Source++)
{
case '#':
iswild=1;
if(*Source=='?')
{
Source++;
PUT(MP_ALL);
}else
{
PUT(MP_MULT);
*--stack=MP_MULT_END;
continue;
}
break;
case '~':
iswild=1;
PUT(MP_NOT);
*--stack=MP_NOT_END;
continue;
case '?':
iswild=1;
PUT(MP_SINGLE);
break;
case '(':
PUT(MP_OR);
*--stack=MP_OR_END;
continue;
case '|':
iswild=1;
if(stack!=end&&*stack!=MP_OR_END)
ERROR(ERROR_BAD_TEMPLATE);
PUT(MP_OR_NEXT);
break;
case ')':
if(stack==end||*stack!=MP_OR_END)
ERROR(ERROR_BAD_TEMPLATE);
PUT(*stack++);
break;
case '[':
if(*Source=='~')
{
Source++;
PUT(MP_NOT_SET);
}else
PUT(MP_SET);
a=*Source++;
if(!a)
ERROR(ERROR_BAD_TEMPLATE);
do
{
if(Source[0]=='-'&&Source[1]!=']')
{
Source++;
b=*Source++;
if(!b)
ERROR(ERROR_BAD_TEMPLATE);
if(b>a)
t=a, a=b, b=t;
PUT(MP_DASH);
if(b>=0x81&&b<=0x8e)
{
PUT(MP_ESCAPE);
b-=0x80;
}
PUT(ToLower(b));
}
if(a>=0x81&&a<=0x8e)
{
PUT(MP_ESCAPE);
a-=0x80;
}
PUT(ToLower(a));
a=*Source++;
if(!a)
ERROR(ERROR_BAD_TEMPLATE);
}while(a!=']');
PUT(MP_SET_END);
break;
case '*':
if(DOSBase->dl_Flags&RNF_WILDSTAR)
{
PUT(MP_ALL);
}else
PUT('*');
break;
case '\'':
if(!*Source++)
ERROR(ERROR_BAD_TEMPLATE);
/* Fall through */
default:
a=Source[-1];
if(a>=0x81&&a<=0x8e)
{
PUT(MP_ESCAPE);
a-=0x80;
}
PUT(ToLower(a));
break;
}
while(stack!=end&&*stack!=MP_OR_END)
PUT(*stack++);
}
if(stack!=end)
ERROR(ERROR_BAD_TEMPLATE);
PUT(MP_OR_END);
PUT(0);
return iswild;
__AROS_FUNC_EXIT
} /* ParsePatternNoCase */